package com.ruoyi.project.courseuser.courseuser.service.impl;

import java.util.*;
import java.util.concurrent.locks.ReentrantLock;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.course.course.domain.BCourse;
import com.ruoyi.project.course.course.service.IBCourseService;
import com.ruoyi.project.courseuser.courseuser.entity.req.AddCourseUserReq;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.project.courseuser.courseuser.mapper.BCourseUserMapper;
import com.ruoyi.project.courseuser.courseuser.domain.BCourseUser;
import com.ruoyi.project.courseuser.courseuser.service.IBCourseUserService;
import com.ruoyi.common.utils.text.Convert;
import org.springframework.transaction.annotation.Transactional;

/**
 * 用户报名活动课程Service业务层处理
 * 
 * @author ruoyi
 * @date 2024-01-24
 */
@Service
public class BCourseUserServiceImpl implements IBCourseUserService 
{
    @Autowired
    private BCourseUserMapper bCourseUserMapper;
    @Autowired
    IBCourseService courseService;

    private final ReentrantLock lock = new ReentrantLock();


    /**
     * 查询用户报名活动课程
     * 
     * @param id 用户报名活动课程主键
     * @return 用户报名活动课程
     */
    @Override
    public BCourseUser selectBCourseUserById(Long id)
    {
        return bCourseUserMapper.selectBCourseUserById(id);
    }

    /**
     * 查询用户报名活动课程列表
     * 
     * @param bCourseUser 用户报名活动课程
     * @return 用户报名活动课程
     */
    @Override
    public List<BCourseUser> selectBCourseUserList(BCourseUser bCourseUser)
    {
        return bCourseUserMapper.selectBCourseUserList(bCourseUser);
    }

    /**
     * 新增用户报名活动课程
     * 
     * @param bCourseUser 用户报名活动课程
     * @return 结果
     */
    @Override
    public int insertBCourseUser(BCourseUser bCourseUser)
    {
        bCourseUser.setCreateTime(DateUtils.getNowDate());
        return bCourseUserMapper.insertBCourseUser(bCourseUser);
    }

    /**
     * 修改用户报名活动课程
     * 
     * @param bCourseUser 用户报名活动课程
     * @return 结果
     */
    @Override
    public int updateBCourseUser(BCourseUser bCourseUser)
    {
        bCourseUser.setUpdateTime(DateUtils.getNowDate());
        return bCourseUserMapper.updateBCourseUser(bCourseUser);
    }

    /**
     * 批量删除用户报名活动课程
     * 
     * @param ids 需要删除的用户报名活动课程主键
     * @return 结果
     */
    @Override
    public int deleteBCourseUserByIds(String ids)
    {
        return bCourseUserMapper.deleteBCourseUserByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除用户报名活动课程信息
     * 
     * @param id 用户报名活动课程主键
     * @return 结果
     */
    @Override
    public int deleteBCourseUserById(Long id)
    {
        return bCourseUserMapper.deleteBCourseUserById(id);
    }

    /**
     * 报名
     *
     * @param req
     * @return
     */
    @Override
    @Transactional
    public synchronized AjaxResult addCourseUser(AddCourseUserReq req) {
        lock.lock();
        try {
            if(ObjectUtils.isEmpty(req)){
                return AjaxResult.error("报名信息为空");
            }
            if(ObjectUtils.isEmpty(req.getOpenId())){
                return AjaxResult.error("微信信息未获取");
            }
            BCourse bCourse = courseService.selectBCourseById(req.getCourseId());
            if(ObjectUtils.isEmpty(bCourse)){
                return AjaxResult.error("课程信息不存在");
            }

            if(!bCourse.getCouresStatus().equals(0)){
                return AjaxResult.error("课程已下架");
            }
            long i = DateUtils.differentDaysByMinute( new Date(),bCourse.getEnrollEndTime());
            if(i < 0){
                return AjaxResult.error("课程报名日期已截止");
            }
            //查询是否存在报名未完成信息
            BCourseUser user=new BCourseUser();
            //user.setUserPhone(req.getUserPhone());
            user.setEnrollEndTime(new Date());
            user.setUserWxOpenId(req.getOpenId());
            user= bCourseUserMapper.findBCourseUse(user);
            if(ObjectUtils.isNotEmpty(user)){
                return AjaxResult.error("已有报名课程");
            }

            //检查是否报名人数足够
            Integer count = bCourseUserMapper.findBCourseUseByCourseId(req.getCourseId());
            if(ObjectUtils.isEmpty(count)){
                count=0;
            }
            if(count.intValue() > bCourse.getCourseUserCount().intValue()){
                return AjaxResult.error("课程报名人数已满");
            }
            BCourseUser insertuser=new BCourseUser();
            insertuser.setCourseName(bCourse.getCourseName());
            insertuser.setCourseUserCount(bCourse.getCourseUserCount());
            insertuser.setCourseDate(bCourse.getCourseDate());
            insertuser.setCourseTime(bCourse.getCourseTime());
            insertuser.setEnrollEndTime(bCourse.getEnrollEndTime());
            insertuser.setCourseArea(bCourse.getCourseArea());
            insertuser.setUserName(req.getUserName()+"_"+count);
            insertuser.setUserPhone(req.getUserPhone());
            insertuser.setUserWxOpenId(req.getOpenId());
            insertuser.setCourseId(req.getCourseId());
            insertuser.setUserIdCard(req.getUserIdCard());
            bCourseUserMapper.insertBCourseUser(insertuser);
        }catch (Exception e){
            return AjaxResult.error("报名异常，请联系客服");
        }finally {
            try {
                lock.unlock();
            }catch (Exception e){
                return AjaxResult.error("报名异常，请联系客服");
            }

        }
        return AjaxResult.success();
    }
}
